package com.scoressystem.advice;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpSession;

/**
 * 登录状态切面类
 * 用于拦截控制器请求，验证用户登录状态
 * 未登录时自动跳转至登录页面
 */
@Aspect
@Component
public class LoginAdvice {

    // 不需要登录验证的方法名
    private static final String[] EXCLUDE_METHODS = {"login", "createCode"};

    // 登录页面路径
    private static final String LOGIN_PAGE_REDIRECT = "redirect:/login";

    @Autowired
    private HttpSession session;

    /**
     * 环绕通知：拦截所有控制器中的方法
     * 验证用户登录状态，未登录则重定向到登录页面
     *
     * @param joinPoint 连接点对象
     * @return 方法执行结果或登录页面重定向
     * @throws Throwable 方法执行异常
     */
    @Around(value = "execution(* com.scoressystem.controller.*.*(..))")
    public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {

        String methodName = joinPoint.getSignature().getName();


        if (isExcludedMethod(methodName)) {
            return joinPoint.proceed();
        }


        Object currentUser = session.getAttribute("nowusername");
        if (currentUser == null) {
            return LOGIN_PAGE_REDIRECT;
        }

        try {
            return joinPoint.proceed();
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * 判断方法是否在排除列表中
     *
     * @param methodName 方法名
     * @return 是否需要排除
     */
    private boolean isExcludedMethod(String methodName) {
        for (String excludedMethod : EXCLUDE_METHODS) {
            if (excludedMethod.equals(methodName)) {
                return true;
            }
        }
        return false;
    }
}
